package com.quantoeugasto.entidade;

import java.util.LinkedList;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;

/**
 * Classe que representa um usário no sistema.
 * 
 * @author Fabiano
 */
@Entity
@SuppressWarnings("serial")
public class Usuario extends Entidade<String>{
	
	private String username;
	private String senha;
	private String nome;
	private String sobrenome;
	private List<Categoria> categorias;
	private List<Ano> anos;
	
	/**
	 * Construtor padrão.
	 */
	public Usuario (){
		
	}
	
	/**
	 * Cria um novo usuário com o username informado.
	 * 
	 * @param username Username do usuário. Deverá ser único no sistema.
	 */
	public Usuario (String username){
		this.username = username;
	}
	
	/**
	 * Cria um novo usuário com os atributos informados.
	 * 
	 * @param username Username do usuário. Deverá ser único no sistema.
	 * @param senha Senha do usuário.
	 * @param nome Nome do usuário.
	 * @param sobrenome Sobrenome do usuário. 
	 */
	public Usuario(String username, String senha, String nome, String sobrenome) {
		this.username = username;
		this.senha = senha;
		this.nome = nome;
		this.sobrenome = sobrenome;
		this.categorias = new LinkedList<Categoria>();
		this.anos = new LinkedList<Ano>();
	}

	@Id
	@Column(length = 20)
	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	@Column(length = 20, nullable = false)
	public String getSenha() {
		return senha;
	}

	public void setSenha(String senha) {
		this.senha = senha;
	}

	@Column(length = 20, nullable = false)
	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	@Column(length = 20)
	public String getSobrenome() {
		return sobrenome;
	}

	public void setSobrenome(String sobrenome) {
		this.sobrenome = sobrenome;
	}

	@OneToMany(mappedBy = "usuario")
	@OrderBy("id")
	public List<Categoria> getCategorias() {
		return categorias;
	}

	public void setCategorias(List<Categoria> categorias) {
		this.categorias = categorias;
	}

	@OneToMany(mappedBy = "usuario")
	@OrderBy("ano")
	public List<Ano> getAnos() {
		return anos;
	}

	public void setAnos(List<Ano> anos) {
		this.anos = anos;
	}

	@Override
	public String obterChavePrimaria() {
		return this.username;
	}
	
}
